#pragma once



class Sintactico
{
public:
	Sintactico(void);
	Sintactico(string dir);
	~Sintactico(void);
	Sentencia* S();
	Sentencia* PROGRAMAS();
	void DECLARAR(tabla_simbolos* ts);
	void DECLARAR_PRI(tabla_simbolos* ts);
	void ENTER();
	void ENTER_PRI();
	tipo_ts* TIPODATO();
	tipo_ts* ARREGLO();
	vector<TipoDato*> DIMS(vector<TipoDato*> index);
	vector<TipoDato*> DIMS_PRI(vector<TipoDato*> index);
	TipoDato* DIMS_2PRI();
	vector<string> LISTAID(vector<string> ids);
	vector<string> LISTAID_PRI(vector<string> ids);
	void REGISTRO();
	void REGISTRO_PRI();
	void PROCEDIMIENTO_FUNCION();
	void PROCEDIMIENTO_FUNCION_PRI();
	vector<Expr*> EXPRS(vector<Expr*> expr);
	vector<Expr*> EXPRS_PRI(vector<Expr*> expr);
	Expr* EXPR();
	Expr* R();
	Expr* R_PRI(Expr* E_);
	Expr* E();
	Expr* E_PRI(Expr* T_);
	Expr* T();
	Expr* T_PRI(Expr* P_);
	Expr* P();
	Expr* P_PRI(Expr* F_);
	Expr* F();
	TipoDato* LITERAL();
	vector<TipoDato*> LITERAL_PRI(vector<TipoDato*> tipodato);
	vector<TipoDato*> LITERAL_2PRI(vector<TipoDato*> tipodato);
	Retorne* RETORNE();
	tipo_ts* TIPORETORNO();
	Sentencia* INTRUCCIONES();
	Sentencia* INSTRUCCION();
	Sentencia* INSTRCICLO();
	Sentencia* INSTRCONDICIONAL();
	void PARAMS(tabla_simbolos* ts);
	void PARAMS_PRI(tabla_simbolos* ts);
	void PARAMS_2PRI(tabla_simbolos* ts);
	item_ts* PARAM_PRI();
	item_ts* PARAM();
	Escriba* ESCRIBA();
	Llamar* LLAMAR();
	vector<Expr*> LLAMAR_PRI();
	vector<Expr*> LLAMAR_2PRI();
	Lea* LEA();
	vector<Variable*> LISTAVARIABLES(vector<Variable*> variables);
	vector<Variable*> LISTAVARIABLES_PRI(vector<Variable*> variables);
	Asignar* ASIGNAR();
	Variable* VARIABLE();
	Variable* VARIABLE_PRI();
	Variable* VARIABLE_2PRI();
	Variable* VARIABLE_3PRI();
	Variable* VARIABLE_4PRI();
	Sentencia* SINO();
	CasoList* CASO();
	Sentencia* FINCASO();
	void PROCEDIMIENTO();
	void FUNCION();

	void match(int tokentype);
	void print(Sentencia * sentencia);
	tabla_simbolos* getTablaVaribales(){
		return this->tabla_de_variables;
	}
	tabla_simbolos* getTablaTipos(){
		return this->tabla_de_tipos;
	}

private:
	Lexico *lexico;
	Token *token_actual;
	TokenType tokentype;
	tabla_simbolos *tabla_de_tipos;
	tabla_simbolos *tabla_de_variables;
};

